package jp.idahopotato.util;

import jp.idahopotato.bean.Calc;
import jp.idahopotato.bean.Jewel;
import jp.idahopotato.bean.Protec;

public class Util {

	/**
	 * 検索条件を設定する
	 * @param gender 性別
	 * @param lower レア度下限
	 * @param upper レア度上限
	 * @param skillSet 発動スキルIDリスト
	 * @return 文字列
	 */
	public static String getWhere(String type, String gender, int lower, int upper, String[] skillSet) {
		StringBuilder where = new StringBuilder();
		where.append(" t_protec.part = ? ");
		where.append(" and t_protec.type <> '").append(type).append("'");
		where.append(" and t_protec.gender <> '").append(gender).append("'");
		where.append(" and t_protec.rare >= ").append(lower);
		where.append(" and t_protec.rare <= ").append(upper);
		where.append(" and t_protec.is_use = 1 ");
		where.append(" and ( t_on_skill.on_skill_id = '").append(skillSet[0]).append("'");
		for(int i=1; i<skillSet.length; i++){
			where.append(" or t_on_skill.on_skill_id = '").append(skillSet[i]).append("'");
		}
		where.append(" ) ");
		return where.toString();
	}

	/**
	 * スロット数をカウントする
	 * @param ps
	 * @param sl_cnt
	 */
	public static void countSlotNum(Protec ps, int[] sl_cnt){
		if(ps.getSlotNum() == 1){
			sl_cnt[1]++;
		} else if(ps.getSlotNum() == 2){
			sl_cnt[2]++;
		} else if(ps.getSlotNum() == 3){
			sl_cnt[3]++;
		} else {
			sl_cnt[0]++;
		}
	}

	/**
	 *
	 * @param cal
	 * @param jwl
	 * @param sl
	 * @param sReq
	 */
	public static void slotSet(Calc cal, Jewel jwl, int sl, int sReq){
		for(int i=0; i<jwl.getSkillpoints().length; i++){
			cal.getSklpntCnt()[jwl.getSkillpoints()[i].getId()] += jwl.getSkillpoints()[i].getPoint();
		}
		cal.getSlotCnt()[sl]--;
		cal.getSlotCnt()[sl-(jwl.getSlotNum())]++;

		cal.getJewelSkill()[cal.getJcount()] = jwl.getSkillpoints()[0].getId();
		cal.getJewelId()[cal.getJcount()] = jwl.getSlotNum();
		cal.setJcount(cal.getJcount()+ 1);
	}


	//ここでは、２スロ装飾品は２スロの空きにいれずに、あれば３スロに入れる
	//バグあり、残り4ポイントのとき、2スロ装飾品を優先するべき
	boolean setBig(Calc cal, int sReq, int setPnt){
		//再帰条件
		if(setPnt <= 0){
			return true;
		}
		//条件を満たせない場合
		if(cal.getSlotCnt()[1] <= 0 && cal.getSlotCnt()[2] <= 0 && cal.getSlotCnt()[3] <= 0){
			return false;
		}

		//スロ数が一番多い装飾品
		Jewel jwl = new Jewel();

		if(jwl.getSlotNum() == 3){
			//３のに入れるか、
			if(cal.getSlotCnt()[3] > 0){
				slotSet(cal, jwl, 3, sReq);
				setPnt -= jwl.getSkillpoints()[0].getPoint();

				if(setPnt > 3){
					return setBig(cal, sReq, setPnt);
				}
			}
		} else if(jwl.getSlotNum() == 2){
			//最初に2のスロットに入れるべき!
			if(cal.getSlotCnt()[2] > 0){
				//まず2の空きに入れる
				slotSet(cal, jwl, 2, sReq);
				setPnt -= jwl.getSkillpoints()[0].getPoint();

				if(setPnt > 3){
					return setBig(cal, sReq, setPnt);
				}

			} else if(cal.getSlotCnt()[3] > 0){
				//なければ3の空きに入れる
				slotSet(cal, jwl, 3, sReq);
				setPnt -= jwl.getSkillpoints()[0].getPoint();

				if(setPnt > 3){
					return setBig(cal, sReq, setPnt);
				}
			}
		}
		//大きさが1の場合true
		//入れられるスロットがないが空きスロットがある場合true
		return true;
	}


	//主に１スロの装飾品を付けていく
	//１の空きがないと、２を使って、３を使っていくことになる
	boolean setSmall(Calc cal, int sReq, int setPnt){
		//再帰条件
		if(setPnt <= 0){
			return true;
		}
		//条件を満たせない場合
		if(cal.getSlotCnt()[1] <= 0 && cal.getSlotCnt()[2] <= 0 && cal.getSlotCnt()[3] <= 0){
			return false;
		}

		//そのスキルポイントを持つ装飾品の準備
		Jewel jwl = new Jewel();

		if(setPnt >= 3){// && ((js->jewels->Length>1) && (js->jewels[1]->slotNum==2))){
			//残り3ポイント以上必要で、必要スロット2の装飾品がある場合(攻撃、防御用)
			jwl = new Jewel();

			if(cal.getSlotCnt()[2] > 0){
				//2のに入れて、setSmall
				slotSet(cal, jwl, 2, sReq);
				setPnt -= jwl.getSkillpoints()[0].getPoint();
			} else if(cal.getSlotCnt()[3] > 0){
				//3のに入れてsetSmallか
				slotSet(cal, jwl, 3, sReq);
				setPnt -= jwl.getSkillpoints()[0].getPoint();
			} else {
				//空きがないので1スロに1の装飾品を入れて、再帰させる
				jwl = new Jewel();

				slotSet(cal, jwl, 1, sReq);
				setPnt -= jwl.getSkillpoints()[0].getPoint();
			}
		} else {
			//スロ1のを埋め込む、だけ
			if(true){//(js->jewels->Length > 1) && (js->jewels[1]->slotNum == 1)){
				jwl = new Jewel();
			}
//			else {
//				jwl = new Jewel();
//			}
			if(cal.getSlotCnt()[1] > 0){
				slotSet(cal, jwl, 1, sReq);
				setPnt -= jwl.getSkillpoints()[0].getPoint();
			} else if(cal.getSlotCnt()[2] > 0){
				slotSet(cal, jwl, 2, sReq);
				setPnt -= jwl.getSkillpoints()[0].getPoint();
			} else {
				slotSet(cal, jwl, 3, sReq);
				setPnt -= jwl.getSkillpoints()[0].getPoint();
			}

		}

		return setSmall(cal, sReq, setPnt);
	}

}
